#!/usr/bin/env ruby

$LOAD_PATH << File.expand_path("../../../lib/rubyFulguro/fulguro")


require 'fulguro'
include Fulguro

#######################################
### Geodesic Reconstruction by dilation
#######################################
def geodesic_rec_dilate(immarker,immask,nhb)
    if nhb.connexity==FLGR_8_CONNEX
        nhb = FLGR_Data2D.new(3,3,immarker.spp,immarker.type,FLGR_RECT,FLGR_8_CONNEX)
    elsif nhb.connexity==FLGR_6_CONNEX
        nhb = FLGR_Data2D.new(3,3,immarker.spp,immarker.type,'HEX',FLGR_6_CONNEX)
    else
        nhb = FLGR_Data2D.new(3,3,immarker.spp,immarker.type,FLGR_CROSS,FLGR_4_CONNEX);
    end
    imtmp1 = FLGR_Data2D.new(immarker)
    imtmp2 = FLGR_Data2D.new(immarker)
    
    flgr2d_copy(imtmp2,immarker)
    flgr2d_dilate(imtmp1,imtmp2,nhb)
    flgr2d_arith_inf(imtmp2,immask,imtmp1)

    while ((immarker == imtmp2)==0)
        flgr2d_copy(immarker,imtmp2)
        flgr2d_dilate(imtmp1,imtmp2,nhb)
        flgr2d_arith_inf(imtmp2,immask,imtmp1)
    end
end

#######################################
### Geodesic Reconstruction by Erosion
#######################################
def geodesic_rec_erode(immarker,immask,nhb)
    if nhb.connexity==FLGR_8_CONNEX
        nhb = FLGR_Data2D.new(3,3,immarker.spp,immarker.type,FLGR_RECT,FLGR_8_CONNEX)
    elsif nhb.connexity==FLGR_6_CONNEX
        nhb = FLGR_Data2D.new(3,3,immarker.spp,immarker.type,'HEX',FLGR_6_CONNEX)
    else
        nhb = FLGR_Data2D.new(3,3,immarker.spp,immarker.type,FLGR_CROSS,FLGR_4_CONNEX);
    end        
    imtmp1 = FLGR_Data2D.new(immarker)
    imtmp2 = FLGR_Data2D.new(immarker)
    
    flgr2d_copy(imtmp2,immarker)
    flgr2d_erode(imtmp1,imtmp2,nhb)
    flgr2d_arith_sup(imtmp2,immask,imtmp1)

    while ((immarker == imtmp2)==0)
        flgr2d_copy(immarker,imtmp2)
        flgr2d_erode(imtmp1,imtmp2,nhb)
        flgr2d_arith_sup(imtmp2,immask,imtmp1)
    end
end

#######################################
### Geodesic Reconstruction by Openning
#######################################
def geodesic_rec_open(imdest,imin,nhb)
    flgr2d_erode(imdest,imin,nhb)
    geodesic_rec_dilate(imdest,imin,nhb)
end

#######################################
### Geodesic Reconstruction by Closing
#######################################
def geodesic_rec_close(imdest,imin,nhb)
    flgr2d_dilate(imdest,imin,nhb)
    geodesic_rec_erode(imdest,imin,nhb)
end

#######################################
### Geodesic Open Tophat
#######################################
def geodesic_rec_open_tophat(imdest,imin,nhb)
    geodesic_rec_open(imdest,imin,nhb)
    flgr2d_arith_sub(imdest,imin,imdest)
end

#######################################
### Geodesic Open Tophat
#######################################
def geodesic_rec_close_tophat(imdest,imin,nhb)
    geodesic_rec_close(imdest,imin,nhb)
    flgr2d_arith_sub(imdest,imdest,imin)
end


##################################################################
### MAIN #########################################################
##################################################################

imin = flgr2d_load_pgm('../../images/gray/cameraman.pgm')
imDest1 = FLGR_Data2D.new(imin)
imDest2 = FLGR_Data2D.new(imin)
imDest3 = FLGR_Data2D.new(imin)

nhb = FLGR_Data2D.new(9,9,1,imin.type,FLGR_RECT,FLGR_8_CONNEX)

flgr2d_dilate(imDest1, imin, nhb)
flgr2d_copy(imDest2,imDest1)
flgr2d_copy(imDest3,imDest1)

print "Fast Dual Geodesic reconstruction\n"
flgr2d_geodesic_reconstruct_dual(imDest1,imin,nhb.connexity)

print "Fast Geodesic reconstruction by dilation\n"
flgr2d_geodesic_reconstruct_erode(imDest2,imin,nhb.connexity)

print "Naive Geodesic reconstruction\n"
geodesic_rec_erode(imDest3,imin,nhb)


flgr_display(imDest1, imDest2, imDest3, "d1", "d2", "d3")
